php 详解序列化及反序列化特征
概述
- php 在定义一个数组,类等很多东西的时候,为了数据传递的方便,都可以对一个对象或者实例进行序列化
对一个数组进行序列化
1 |
|
对一个类进行序列化
1 |
|
序列化格式
拿上面这个类的序列化进行举例
1 | O:1:"F":1:{s:8:"filename";s:5:"a.txt";} |
O
序列化对象的类型,其中有类型 解释 a 数组 b 布尔值 d 双精度浮点型 i 整型 o 普通对象 r 引用 s 字符串 C 自定义对象 O 类 N null值 R 指针引用 U Unicode 字符串 1
序列化的类名的(字符串)长度"F"
是类名本身(字符串形式)1
是这个类中属性(变量)的数量{s:8:”filename”} 中
s
代表属性名(字符串)的类型{s:8:”filename”} 中
8
代表属性名(字符串)的长度{s:8:”filename”} 中
filename
代表属性名(字符串)本身{s:5:”a.txt”} 中
s
代表属性值(字符串)的类型{s:5:”a.txt”} 中
5
代表属性值(字符串)的长度{s:5:”a.txt”} 中
a.txt
代表属性值(字符串)本身序列化结束后的属性内容最后是有一个分号的
序列化的访问控制修饰符造成的影响
- protected 属性被序列化的时候 属性名 会变成
%00*%00属性名
- private 属性被序列化的时候 属性名 会变成
%00类名%00属性名
例如:
1 |
|
魔术方法
- 魔术方法是不算在序列化中属性内容或属性数量里边的
序列化特别的魔术方法- __sleep()
- 如果在序列化类的时候,发现其中有特殊的魔术方法,则会触发不同的序列化效果
- 该方法决定了类中那些属性需要被序列化。如果有此方法,未指明的属性将不会被序列化,若无此方法,则默认全部序列化
- 如果有
__sleep()
方法时,序列化时该方法最先被调用
例如:
1 |
|
反序列化特别的魔术方法- __wakeup()
- 序列化时不会调用,反序列化时检测到此魔术方法,便会依据该方法内的改变,对类中的属性信息(包括属性名,属性值)进行变更
- 如果有
__wakeup()
方法时,反序列化时该方法最先被调用
例如:
1 |
|
php 详解序列化及反序列化特征